// @Author yang
// @Description 
// @Date 2022/1/7
// @Time 11:19

package aop

type WrapF struct {
	f func(data ... interface{}) (interface{}, error)

	ctx *Context
}

func WrapFunc(f func(... interface{}) (interface{}, error)) *WrapF {
	return &WrapF{
		f: f,
		ctx: newContext(),
	}
}

func (w *WrapF) Use(f func(ctx *Context) (interface{}, error)) {
	w.ctx.addMidwares(f)
}

func (w *WrapF) Abort() {
	w.ctx.Abort()
}

func (w *WrapF) Handle(data ... interface{}) (res interface{}, err error) {
	defer w.ctx.Reset()

	w.ctx.addHanders(w.ctx.mdiwares...)
	w.ctx.addHanders(func(ctx *Context) (interface{}, error) {
		return w.f(data)
	})

	if len(w.ctx.handers) > 0 {
		res, err = w.ctx.Next()
		if err != nil {
			return
		}
	}



	return
}

